package com.newly.center.sys.service.authEntity.api;

import com.newly.common.base.constants.AuthConstant;
import com.newly.common.base.entity.sys.auth.entity.bo.AuthEntityBo;
import com.newly.common.base.entity.sys.auth.entity.bo.AuthEntityTypeBo;
import com.newly.common.base.entity.sys.auth.entity.po.AuthEntityPo;

import java.util.List;
import java.util.Map;

/**
 * @program: newly-parent
 * @remark: 权限实体业务接口
 * @author: guan
 * @create: 2022-01-13 11:45
 */
public interface IAuthEntityService {
    /**
     * 通过角色id查询权限实体
     *
     * @param roleIds 角色id
     * @return List AuthEntityPo.class
     */
    List<AuthEntityPo> getByRoleIds(List<Integer> roleIds);

    /**
     * 通过角色id查询权限实体
     *
     * @param roleId 角色id
     * @return List AuthEntityPo.class
     */
    List<AuthEntityPo> getByRoleId(Integer roleId);

    /**
     * 绑定权限实体
     *
     * @param entityType 实体类型
     * @param roleId     角色id
     * @param entityId   权限实体id
     * @return 绑定成功返回true
     */
    boolean bind(AuthConstant.AuthEntityType entityType, Integer roleId, String entityId);

    /**
     * 绑定权限实体
     *
     * @param entityType 实体类型
     * @param roleId     角色id
     * @param entityIds  权限实体id
     * @return 绑定成功返回true
     */
    boolean bind(AuthConstant.AuthEntityType entityType, Integer roleId,
                 List<String> entityIds);

    /**
     * 绑定权限实体
     *
     * @param entityType 实体类型
     * @param entityId   权限实体id
     * @return 绑定成功返回true
     */
    boolean bind(AuthConstant.AuthEntityType entityType, String entityId);

    /**
     * 绑定权限实体
     *
     * @param entityType 实体类型
     * @param entityIds  权限实体id
     * @return 绑定成功返回true
     */
    boolean bind(AuthConstant.AuthEntityType entityType, List<String> entityIds);

    /**
     * 解绑权限实体
     *
     * @param entityType 权限实体类型
     * @param roleId     角色id
     * @param entityIds  实体id
     * @return 解绑成功返回true
     */
    boolean unBind(AuthConstant.AuthEntityType entityType,
                   Integer roleId, List<String> entityIds);

    /**
     * 解绑权限实体
     *
     * @param entityType 权限实体类型
     * @param entityIds  实体id
     * @return 解绑成功返回true
     */
    boolean unBind(AuthConstant.AuthEntityType entityType, List<String> entityIds);

    /**
     * 解绑指定角色的权限实体
     *
     * @param roleId     角色id
     * @param entityType 权限实体类型
     * @return 解绑成功返回true
     */
    boolean unBind(Integer roleId, AuthConstant.AuthEntityType entityType);

    /**
     * 通过角色id删除权限实体
     *
     * @param roleIds 角色id
     * @return 删除成功返回true
     */
    boolean removeByRoleIds(List<Integer> roleIds);

    /**
     * 通过角色id删除权限实体
     *
     * @param roleId 角色id
     * @return 删除成功返回true
     */
    boolean removeByRoleId(Integer roleId);

    /**
     * 获取权限实体类型
     *
     * @return List AuthEntityTypeBo.class
     */
    List<AuthEntityTypeBo> getTypes();

    /**
     * 通过权限实体类型获取权限实体
     *
     * @param typeCode 权限实体类型
     * @return List AuthEntityBo.class
     */
    List<AuthEntityBo> getByTypeCode(Integer typeCode);

    /**
     * 获取当前租户所有权限实体
     *
     * @return key:类型名 List<AuthEntityBo>: 权限实体数据
     */
    List<AuthEntityBo> listAuthEntity();


    /**
     * 通过角色id与类型编码获取权限实体id
     *
     * @param typeCode 类型编码
     * @return 权限实体id
     */
    List<String> getIdsByRoleIdAndTypeCode(Integer roleId, Integer typeCode);

    /**
     * 通过角色id查询权限实体id列表
     *
     * @param roleId 角色id
     * @return key: 实体类型 value: 实体id列表
     */
    Map<Integer, List<String>> getAllIdsByRoleId(Integer roleId);
}
